1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| package com.xxx;
import org.elasticsearch.action.search.ClearScrollRequest; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchScrollRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.enthusa.avatar.core.utils.DateUtil; import org.enthusa.avatar.utils.task.TaskModel; import org.springframework.stereotype.Component;
@Slf4j @Component public class ESScrollTask extends AbstractTask { private static final String[] INCLUDE_FIELDS = {"entity_id", "job_name", "job_city", "edu_level", "locations", "company_id", "career_job_id2", "salary"}; private static final String[] EXCLUDE_FIELDS = {};
public static final int ES_EACH_SIZE = 500; public static final int ES_TOTAL_SIZE = 10000;
@Resource protected RestHighLevelClient utEsClient;
private List<PlatformJob> termSearchWithScroll(Integer recruitType) { final long scrollTimeout = 60000; List<PlatformJob> platformJobs = new ArrayList<>(); try { SearchRequest searchRequest = new SearchRequest(Constants.ES_JOB_ITEM); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(buildQuery(recruitType)); searchSourceBuilder.fetchSource(INCLUDE_FIELDS, EXCLUDE_FIELDS); searchSourceBuilder.size(ES_EACH_SIZE); searchRequest.source(searchSourceBuilder); searchRequest.scroll(TimeValue.timeValueMillis(scrollTimeout));
SearchResponse searchResponse = utEsClient.search(searchRequest, RequestOptions.DEFAULT); String scrollId = searchResponse.getScrollId(); SearchHit[] searchHits = searchResponse.getHits().getHits();
while (searchHits != null && searchHits.length > 0 && platformJobs.size() < ES_TOTAL_SIZE) { for (SearchHit hit : searchHits) { PlatformJob platformJob = new PlatformJob(); platformJob.setJobId(IdMapping.toId((Long) hit.getSourceAsMap().get("entity_id"))); platformJob.setJobName((String) hit.getSourceAsMap().get("job_name")); platformJob.setJobCity((String) hit.getSourceAsMap().get("job_city")); platformJob.setEducation(eduLevelMap.get((Integer) hit.getSourceAsMap().get("edu_level"))); platformJob.setLocations((String) hit.getSourceAsMap().get("locations")); platformJob.setCompanyId((Integer) hit.getSourceAsMap().get("company_id")); platformJob.setCareerJobId2((Integer) hit.getSourceAsMap().get("career_job_id2")); platformJob.setSalary((String) hit.getSourceAsMap().get("salary")); platformJobs.add(platformJob); } SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); scrollRequest.scroll(TimeValue.timeValueMillis(scrollTimeout)); searchResponse = utEsClient.scroll(scrollRequest, RequestOptions.DEFAULT); scrollId = searchResponse.getScrollId(); searchHits = searchResponse.getHits().getHits(); }
ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); clearScrollRequest.addScrollId(scrollId); utEsClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT); } catch (Exception e) { log.info("es search error", e); return Collections.emptyList(); } return platformJobs; }
public BoolQueryBuilder buildQuery(Integer recruitType) { BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.filter(QueryBuilders.termQuery("content_type", IdType.PLATFORM_JOB.toString())); queryBuilder.filter(QueryBuilders.termQuery("status", 0)); queryBuilder.filter(QueryBuilders.termQuery("recruit_type", recruitType)); return queryBuilder; } }
|